CSV 파일로 데이터 모델 관리하기

CSV 모델을 ERD와 SQL 초안으로 옮기고, 구조가 보존됐는지 검토합니다.

QCN

학습 목표

CSV(Comma-Separated Values) 형식의 파일을 사용하여 데이터베이스 모델을 간단하게 정의하고, 이 정보를 바탕으로 ERD(Entity-Relationship Diagram) 이미지를 생성하는 방법을 배웁니다.

  • CSV 파일 헤더를 특정 규칙에 맞게 구성하여 테이블 구조를 정의합니다.
  • 정의된 모델 정보를 LLM Chat에 전달하여 PlantUML 코드를 생성합니다.
  • PlantUML 웹 에디터에서 ERD를 시각화하고 이미지로 저장합니다.
QCN

1. 데이터 모델 정의하기 (CSV) (1/2)

테이블과 컬럼 정보를 CSV 형식으로 정의합니다. 헤더는 TableName, ColumnName, DataType, Length, Nullable, ColumnDescription 으로 구성합니다.

  • CodeHelp 테이블 정의 예시
QCN

1. 데이터 모델 정의하기 (CSV) (2/2)

"TableName","ColumnName","DataType","Length","Nullable","ColumnDescription"
CodeHelp,CodeHelpID,varchar,"10",NO,코드헬프ID
CodeHelp,DataSourceID,varchar,"30",NO,데이터원본ID
CodeHelp,CodeHelpName,nvarchar,"50",YES,코드헬프명
CodeHelp,CommandType,char,"10",YES,명령구분(기초코드: PGM002)
CodeHelp,CommandText,nvarchar,-1,YES,SQL 명령
CodeHelp,CodeColumnID,varchar,"20",YES,코드컬럼ID
CodeHelp,ValueColumnID,varchar,"20",YES,값컬럼ID
CodeHelp,UseYN,char,"1",YES,사용여부
CodeHelp,Comment,nvarchar,"200",YES,설명
CodeHelp,CreatedUserNo,varchar,"32",YES,작성자ID
CodeHelp,CreatedAt,datetime2,-1,YES,작성일시
QCN

1. 데이터 모델 정의하기 (CSV)

  • CodeHelpScheme 테이블 정의 예시
"TableName","ColumnName","DataType","Length","Nullable","ColumnDescription"
CodeHelpScheme,CodeHelpID,varchar,"10",NO,코드헬프ID
CodeHelpScheme,ColumnID,varchar,"50",NO,컬럼ID
CodeHelpScheme,ColumnText,nvarchar,"200",YES,컬럼명
CodeHelpScheme,HiddenYN,bit,-1,YES,숨김여부
CodeHelpScheme,SortingNo,int,-1,YES,정렬순서
QCN

2. 데이터 모델 관계 설정 (1/3)

PlantUML에서는 간단한 기호로 테이블 간의 관계를 표현할 수 있습니다. CodeHelp와 CodeHelpScheme는 1:N 관계를 가집니다.

QCN

2. 데이터 모델 관계 설정 (2/3)

  • 관계 표현 방식
    • -- : 기본 관계선
    • .. : 점선 관계선
    • --o{ : N 관계 (Many)
    • ||-- : 1 관계 (One)
QCN

2. 데이터 모델 관계 설정 (3/3)

  • 관계 정의
    • CodeHelp ||--o{ CodeHelpScheme : "1:N 관계"
QCN

3. LLM Chat을 이용한 PlantUML 코드 생성

민감한 테이블·컬럼명은 가명화한 후 CSV 구조와 관계만 전달합니다. 실제 행 데이터·접속 정보는 넣지 않습니다.

  • 질문 예시

CSV 구조로 되어있는 데이터 모델 정보를 참고해서 CodeHelp 와 CodeHelpScheme 테이블의 간의 관계를 PlantUML ERD 로 만들어줘

QCN

4. PlantUML로 ERD 생성 및 확인

  • 웹 브라우저에서 PlantUML 온라인 에디터로 이동합니다.

    • URL: https://editor.plantuml.com
  • LLM이 생성해준 PlantUML 코드를 에디터에 붙여넣습니다.

  • 실시간으로 생성된 ERD를 확인하고, 원하는 형식(PNG, SVG 등)의 이미지로 다운로드합니다.

QCN

PlantUML 코드 결과 예시 (1/4)

아래는 LLM이 생성한 PlantUML 코드 예시입니다. 이 코드를 에디터에 입력하면 ERD가 그려집니다.

QCN

PlantUML 코드 결과 예시 (2/4)

@startuml
hide circle
skinparam linetype ortho

entity "CodeHelp" {
  + CodeHelpID [PK] : varchar(10)
  --
  DataSourceID : varchar(30)
  CodeHelpName : nvarchar(50)
  CommandType : char(10)
  CommandText : nvarchar
  CodeColumnID : varchar(20)
  ValueColumnID : varchar(20)
  UseYN : char(1)
QCN

PlantUML 코드 결과 예시 (3/4)

  Comment : nvarchar(200)
  CreatedUserNo : varchar(32)
  CreatedAt : datetime2
}

entity "CodeHelpScheme" {
  + CodeHelpID [FK] : varchar(10)
  + ColumnID [PK] : varchar(50)
  --
  ColumnText : nvarchar(200)
  HiddenYN : bit
  SortingNo : int
}

QCN

PlantUML 코드 결과 예시 (4/4)

CodeHelp ||--o{ CodeHelpScheme : "has"
@enduml
QCN

핸즈온 요약

다음 단계로 넘어가기 전에 원본 CSV와 생성 결과를 대조합니다.

  • CSV 파일로 데이터 구조를 명확하게 정의했습니다.
  • 간단한 표기법으로 테이블 간의 관계를 설정했습니다.
  • LLM과 PlantUML을 활용하여 ERD 이미지를 자동으로 생성했습니다.
QCN

잠깐, 구분해 보기

ERD가 그려지면 DB 제약조건도 자동으로 검증된 것일까요?

QCN

데이터베이스 SQL 바이브 코딩

  • LLM의 DDL을 검토하고 격리된 실습 DB에서 실행·확인
  • 데이터 모델을 기반으로 실제 데이터베이스 테이블 생성
  • 개발에 필요한 기본 SQL 쿼리도 이어서 LLM Chat으로 생성
QCN

SQL Server 테이블 스키마를 참고해서 (1/2)

SELECT C.TABLE_NAME AS TableName,
    C.COLUMN_NAME AS ColumnName,
    C.DATA_TYPE AS DataType,
    ISNULL(C.CHARACTER_MAXIMUM_LENGTH, '-1') AS Length,
    C.IS_NULLABLE AS Nullable,
    EP.value AS ColumnDescription
FROM
    INFORMATION_SCHEMA.COLUMNS AS C
	LEFT JOIN sys.extended_properties AS EP ON EP.major_id = OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME)
        AND ep.minor_id = (
            SELECT column_id
            FROM sys.columns
            WHERE object_id = OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME)
QCN

SQL Server 테이블 스키마를 참고해서 (2/2)

                AND name = C.COLUMN_NAME
        )
        AND EP.name = 'MS_Description'
ORDER BY C.TABLE_NAME,
	C.ORDINAL_POSITION;
QCN

LLM 질문 예시

  • 시스템 지침에 정의된 데이터 모델 정보를 참고해서 프로그램을 개발하기 위한 SQL Server 데이터베이스 기반의 데이터의 구조(스키마)를 정의하는 SQL 과 데이터를 조작(조회, 삽입, 수정, 삭제)하는 데 사용하는 SQL 을 만들어줘
  • 사용자 로그인에 필요한 SELECT 쿼리를 만들어줘
  • 사용자 로그인 후에 권한 별로 메뉴 정보를 조회하는 SELECT 쿼리를 만들어줘
QCN

LLM으로 생성하는 SQL: 데이터 조작 (DML)

  • CSV로 정리한 데이터 모델을 LLM Chat에 전달하면 테이블 구조(DDL)뿐 아니라 개발에 필요한 데이터 조작(DML) SQL도 이어서 요청할 수 있습니다.

  • 이를 통해 개발자는 반복적인 CRUD SQL 작성 시간을 줄이고 비즈니스 로직에 더 집중할 수 있습니다.

  • 예를 들어, 사용자 정보를 다루기 위한 기본적인 조회, 삽입, 수정, 삭제 쿼리를 빠르게 받아 볼 수 있습니다.

QCN

자동 생성 쿼리 예시: 사용자 로그인

  • 먼저 사용자와 저장된 비밀번호 해시를 조회합니다. 해시 검증은 서버 인증 코드에서 수행하고, 해시는 클라이언트에 반환하지 않습니다.
-- Users 테이블: 로그인 조회

SELECT
    UserID,
    UserName,
    Email,
    PasswordHash -- 예시 컬럼명: 실제 스키마에 맞게 변경
FROM Users
WHERE UserID = @UserID
  AND UseYn = 'Y';
-- 서버의 검증된 비밀번호 해시 검증기로 확인합니다.
-- 평문 비교나 단순 해시 동등 비교로 인증을 구현하지 않습니다.
QCN

자동 생성 쿼리 예시: 권한별 메뉴 조회 (1/2)

  • 로그인 사용자의 메뉴 표시용 조회 예시입니다. 메뉴를 숨기는 것과 서버 API·데이터 접근 권한을 검사하는 것은 별도입니다.
QCN

자동 생성 쿼리 예시: 권한별 메뉴 조회 (2/2)

-- Menus 테이블: 권한별 메뉴 조회

SELECT
    C.MenuID,
    C.MenuName,
    C.ParentMenuID,
    C.MenuUrl
FROM UserRoles AS A
INNER JOIN RoleMenus AS B
    ON A.RoleID = B.RoleID
INNER JOIN Menus AS C
    ON B.MenuID = C.MenuID
WHERE A.UserID = @UserID
ORDER BY C.SortOrder;
QCN

모델 검토의 완료 기준

  • CSV의 테이블·컬럼·타입·길이·NULL·설명을 ERD와 대조합니다.
  • CodeHelp와 CodeHelpScheme의 1:N 관계를 확인합니다.
  • AI가 만든 DDL·로그인·메뉴 쿼리는 보안과 실패 사례까지 검토합니다.
QCN

발표: 첫 화면의 목표를 말한 뒤 핵심 개념과 예제로 진행합니다. 확인 질문 뒤에는 답할 시간을 주고, 마지막 완료 기준을 남겨 질문을 받습니다. 발표 구성 참고: MIT OpenCourseWare, Patrick Winston, How to Speak (2018), https://ocw.mit.edu/courses/res-tll-005-how-to-speak-january-iap-2018/pages/how-to-speak/

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

질문 후 잠시 기다립니다. 답이 없으면 앞에서 본 예제를 다시 가리킵니다. 확인할 답: 그림은 표현 결과입니다. 키·관계·타입·NULL 조건을 DDL과 실제 DB에서 확인합니다. 다음 주제로 넘어가기 전에 차이를 청중의 표현으로 한 번 확인합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

질문을 받는 동안 이 확인 기준을 화면에 남깁니다. 청중이 자신의 업무에 적용할 다음 행동 하나를 고르게 합니다.